#include <stdio.h>
#include <omp.h>

// 全局变量使用 threadprivate 指令
int counter = 0;
#pragma omp threadprivate(counter)

int increment_counter()
{
    counter++;
    return(counter);
}

int main()
{
    int i;
    
    // 设置线程数为4
    omp_set_num_threads(4);
    
    printf("OpenMP threadprivate 指令验证程序\n");
    printf("-----------------------------------\n\n");
    
    // 第一个并行区域
    printf("第一个并行区域：\n");
    #pragma omp parallel
    {
        int tid = omp_get_thread_num();
        
        // 每个线程调用 increment_counter 三次
        for (i = 0; i < 3; i++) {
            int val = increment_counter();
            #pragma omp critical
            {
                printf("线程 %d: counter = %d\n", tid, val);
            }
        }
    }
    
    // 主线程的 counter 值
    printf("\n主线程的 counter 值: %d\n\n", counter);
    
    // 重置主线程的 counter
    counter = 100;
    printf("主线程的 counter 被重置为 100\n\n");
    
    // 第二个并行区域
    printf("第二个并行区域：\n");
    #pragma omp parallel
    {
        int tid = omp_get_thread_num();
        
        // 首先显示初始值
        #pragma omp critical
        {
            printf("线程 %d: 初始 counter = %d\n", tid, counter);
        }
        
        // 再次增加计数器并显示
        int val = increment_counter();
        #pragma omp critical
        {
            printf("线程 %d: 增加后 counter = %d\n", tid, val);
        }
    }
    
    // 再次检查主线程的值
    printf("\n主线程的 counter 最终值: %d\n", counter);
    
    return 0;
}